home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / MATH / VECTOR / MATH1.PAS next >
Encoding:
Pascal/Delphi Source File  |  1994-07-07  |  5.2 KB  |  279 lines

  1. Unit Math1;
  2.  
  3. interface
  4.  
  5. uses winprocs;
  6.  
  7. FUNCTION ARCCOS(C:REAL):REAL;
  8. FUNCTION LOG(Y,DEFAULT:REAL):REAL;
  9. FUNCTION LOGBASE(Y,BASE,DEFAULT:REAL):REAL;
  10. FUNCTION LIGHT(A1,A2,A3,B1,B2,B3,C1,C2,C3,L1,L2,L3:REAL;AC:INTEGER):REAL;
  11. PROCEDURE VUNIT(I,J,K,o1,o2,o3:REAL;MODE:BOOLEAN;VAR VU);
  12. PROCEDURE CROSSPRODUCT(V1,V2,V3,V4,V5,V6,V7,V8,V9:REAL;VAR CA);
  13. FUNCTION  DOTPRODUCT(V1,V2,V3,V4,V5,V6,V7,V8,V9:REAL;MODE:BOOLEAN):real;
  14. PROCEDURE SORT5000(N:INTEGER;VAR OL,NL);
  15.  
  16. implementation
  17.  
  18. FUNCTION ARCCOS(C:REAL):REAL;
  19.  
  20. VAR
  21. S,F:REAL;
  22. BEGIN
  23. {c must be a number -1=<number<= 1, function gives arccos of c}
  24. IF ABS(C)>1 THEN
  25. BEGIN
  26. ARCCOS:=0;
  27. END
  28. ELSE
  29. BEGIN
  30. IF C=0 THEN
  31. BEGIN
  32. ARCCOS:=PI/2;
  33. END
  34. ELSE
  35. BEGIN
  36. IF C=1 THEN
  37. BEGIN
  38. S:=0;
  39. F:=ARCTAN(S/C);
  40. END
  41. ELSE
  42. BEGIN
  43. S:=SQRT(1-SQR(C));
  44. F:=ARCTAN(S/ABS(C));
  45. END;
  46. IF C<0 THEN
  47. BEGIN
  48. ARCCOS:=F*(C/(ABS(C)))+PI;
  49. END
  50. ELSE
  51. BEGIN
  52. ARCCOS:=F;
  53. END;
  54. END;
  55. END;
  56. END;
  57.  
  58.  
  59. FUNCTION LOG(Y,DEFAULT:REAL):REAL;
  60. BEGIN
  61. {finds log (base 10) of y}
  62. IF Y<=0 THEN
  63. BEGIN
  64. LOG:=DEFAULT;
  65. END
  66. ELSE
  67. BEGIN
  68. LOG:=(LN(Y))/(LN(10));
  69. END;
  70. END;
  71.  
  72. FUNCTION LOGBASE(Y,BASE,DEFAULT:REAL):REAL;
  73. BEGIN
  74. {finds the log (of base specified by base) of y}
  75. IF Y<=0 THEN
  76. BEGIN
  77. LOGBASE:=DEFAULT;
  78. END
  79. ELSE
  80. BEGIN
  81. IF BASE<=0 THEN
  82. BEGIN
  83. LOGBASE:=DEFAULT;
  84. END
  85. ELSE
  86. BEGIN
  87. IF LN(BASE)=0 THEN
  88. BEGIN
  89. LOGBASE:=DEFAULT;
  90. END
  91. ELSE
  92. BEGIN
  93. LOGBASE:=(LN(Y))/(LN(BASE));
  94. END;
  95. END;
  96. END;
  97. END;
  98.  
  99.  
  100. FUNCTION LIGHT(A1,A2,A3,B1,B2,B3,C1,C2,C3,L1,L2,L3:REAL;AC:INTEGER):REAL;
  101. VAR
  102. CP:ARRAY[1..3] OF REAL;
  103. DP:ARRAY[1..3] OF REAL;
  104. VUP:ARRAY[1..3] OF REAL;
  105. a:real;
  106. BEGIN
  107. {finds the angle between light directed at the normal at c1c2c3 and l1l2l3.  a1a2a3-c1c2c3 is
  108. crossproducted with b1b2b3-c1c2c3(note: both vectors lie in surface of object) then l1l2l3
  109. represents origin of light, angle between l1l2l3-c1c2c3 and normal is found to aid in shading
  110. surface.  In mode ac=0 ,1 represents direct light, 0 =90 degrees difference, -1= 180 degrees
  111. difference between light source and normal of surface,mode=1 gives angle, mode<>1 gives cosine of angle} 
  112. CROSSPRODUCT(A1,A2,A3,B1,B2,B3,C1,C2,C3,CP);
  113. VUNIT(L1,L2,L3,c1,c2,c3,true,VUP);
  114. a:=DOTPRODUCT(CP[1],CP[2],CP[3],VUP[1],VUP[2],VUP[3],0,0,0,true);
  115. IF AC=1 THEN
  116. BEGIN
  117. LIGHT:=arccos(a);
  118. END
  119. ELSE
  120. BEGIN
  121. LIGHT:=a;
  122. END;
  123. END;
  124.  
  125. PROCEDURE VUNIT(I,J,K,o1,o2,o3:REAL;mode:boolean;VAR VU);
  126. TYPE
  127. UN=ARRAY[1..3] OF REAL;
  128. VAR
  129. A4,A5,A6,A7,A8,A9,A10,D1,D2,D3:REAL;
  130. BEGIN
  131. {vu is array[1..3] of real.  If mode is true, vu receives cosines of vector ijk-o1o2o3, if mode is false,
  132. vu receives angles instead of cosines}
  133. A4:=SQRT(((I-o1)*(I-o1))+((J-o2)*(J-o2))+((K-o3)*(K-o3)));
  134. IF A4=0 THEN
  135. BEGIN
  136. A5:=I;
  137. A6:=J;
  138. A7:=K;
  139. END
  140. ELSE
  141. BEGIN
  142. A5:=I/A4;
  143. A6:=J/A4;
  144. A7:=K/A4;
  145. END;
  146. A8:=ARCCOS(A5);
  147. A9:=ARCCOS(A6);
  148. A10:=ARCCOS(A7);
  149. if (mode=true) then
  150. begin
  151. UN(VU)[1]:=A5;
  152. UN(VU)[2]:=A6;
  153. UN(VU)[3]:=A7;
  154. end
  155. else
  156. begin
  157. UN(VU)[1]:=A8;
  158. UN(VU)[2]:=A9;
  159. UN(VU)[3]:=A10;
  160. end;
  161. END;
  162.  
  163. PROCEDURE CROSSPRODUCT(V1,V2,V3,V4,V5,V6,V7,V8,V9:REAL;VAR CA);
  164. TYPE
  165. CROSSP=ARRAY[1..3] OF REAL;
  166. VAR
  167. A1,A2,A3,A4,A5,A6,A7,B1,B2,B3,B4,B5,B6,B7,C1,C2,C3,C4,C5,C6,D1,D2,D3,D4,D5,D6:REAL;
  168. BEGIN
  169. {v7v8v9 is common point, v1v2v3-v7v8v9 rotates into v4v5v6-v7v8v9.  Result is cosines
  170. of crossproduct stored in ca:array[1..3]of real}
  171. C1:=-((V3-V9)*(V5-V8))+(V2-V8)*(V6-V9);
  172. C2:=(V3-V9)*(V4-V7)-((V1-V7)*(V6-V9));
  173. C3:=(V1-V7)*(V5-V8)-((V2-V8)*(V4-V7));
  174. C4:=SQRT(SQR(C1)+SQR(C2)+SQR(C3));
  175. IF C4=0 THEN
  176. BEGIN
  177. D1:=C1;
  178. D2:=C2;
  179. D3:=C3;
  180. END
  181. ELSE
  182. BEGIN
  183. D1:=C1/C4;
  184. D2:=C2/C4;
  185. D3:=C3/C4;
  186. END;
  187. CROSSP(CA)[1]:=D1;
  188. CROSSP(CA)[2]:=D2;
  189. CROSSP(CA)[3]:=D3;
  190. END;
  191.  
  192. Function DOTPRODUCT(V1,V2,V3,V4,V5,V6,V7,V8,V9:REAL;mode:boolean):real;
  193. VAR
  194. A1,A2,A3,A4,A5,A6,A7,B1,B2,B3,B4,B5,B6,B7,C5,C6:REAL;
  195. BEGIN
  196. {v7v8v9 common point,  v1v2v3-v7v8v9 one vector, v4v5v6-v7v8v9 the other,
  197. function gives cosine of angle between vectors for mode=true, for mode
  198. equal false gives angle}
  199. A4:=SQRT(((v1-v7)*(V1-V7))+((V2-V8)*(v2-v8))+((V3-V9)*(v3-v9)));
  200. B4:=SQRT(((V4-V7)*(v4-v7))+((V5-V8)*(v5-v8))+((V6-V9)*(v6-v9)));
  201. IF A4=0 THEN
  202. BEGIN
  203. A1:=V1-V7;
  204. A2:=V2-V8;
  205. A3:=V3-V9;
  206. END
  207. ELSE
  208. BEGIN
  209. A1:=(V1-V7)/A4;
  210. A2:=(V2-V8)/A4;
  211. A3:=(V3-V9)/A4;
  212. END;
  213. IF B4=0 THEN
  214. BEGIN
  215. B1:=V4-V7;
  216. B2:=V5-V8;
  217. B3:=V6-V9;
  218. END
  219. ELSE
  220. BEGIN
  221. B1:=(V4-V7)/B4;
  222. B2:=(V5-V8)/B4;
  223. B3:=(V6-V9)/B4;
  224. END;
  225. C5:=A1*B1+A2*B2+A3*B3;
  226. C6:=ARCCOS(C5);
  227. if (mode=true) then
  228. begin
  229. dotproduct:=c5;
  230. end
  231. else
  232. begin
  233. dotproduct:=c6;
  234. end;
  235. END;
  236.  
  237. PROCEDURE SORT5000(N:INTEGER;VAR OL, NL);
  238. LABEL 3;
  239. TYPE
  240. OLH=ARRAY[1..5000] OF REAL;
  241. NLH=ARRAY[1..5000] OF REAL;
  242. VAR
  243. P,I,J,H,S:INTEGER;
  244. V:REAL;
  245. BEGIN
  246. {sorts real numbers in ol:array[1..x] of real from smallest to largest and places them in
  247. nl:array[1..x] of real which you
  248. provide. N is the number of numbers to be sorted.  ol and nl can be array of any size as
  249. long as x is =<5000
  250. Unless you change the type declaration for olh and nlh, arrays
  251. cannot exceed 1..5000.  Method is supposed to be one of the fastest bubble sort methods}
  252.  
  253. FOR S:=1 TO N DO
  254. BEGIN
  255. NLH(NL)[S]:=OLH(OL)[S];
  256. END;
  257. H:=1;
  258. WHILE H<=N DO
  259. BEGIN
  260. H:=3*H+1;
  261. END;
  262. REPEAT
  263. H:=TRUNC(H/3);
  264. FOR I:=H+1 TO N DO
  265. BEGIN
  266. V:=NLH(NL)[I];
  267. J:=I;
  268. WHILE NLH(NL)[J-H]>V DO
  269. BEGIN
  270. NLH(NL)[J]:=NLH(NL)[J-H];
  271. J:=J-H;
  272. IF J<=H THEN GOTO 3;
  273. END;
  274. 3: NLH(NL)[J]:=V;
  275. END;
  276. UNTIL H=1;
  277. END;
  278.  
  279. END.